<?php

class Email
{
	private $idEmail;
	private $idCurso;
	private $idRemetente;
	private $assunto;
	private $mensagem;
	private $dataHora;
	private $rascunho;
	private $lixeira;
	private $removido;
	private $lido;
	
	public function Email($idEmail = NULL, $arrParams = NULL) {
				if(is_numeric($id)){
				//mysql_fetch_object($result, 'Atividades');
				
				$arrParams = BancoDados::queryArray("SELECT * FROM emails WHERE idEmail = " . $idEmail);
				if(!is_array($arrParams)) return false; //se foi passado id masnão vem nada do banco retorna false
			}
		if(is_numeric($id) || $arrParams != NULL){
			extract($arrParams);
			
			$this->setIdEmail($idEmail);
			$this->setIdCurso($idCurso);
			$this->setIdRementente($idRemetente);
			$this->setAssunto($assunto);
			$this->setMensagem($mensagem);
			$this->setDataHora($dataHora);
			$this->setRascunho($rascunho);
			$this->setLixeira($lixeira);
			$this->setRemovido($removido);
			$this->setLido($lido);
		}
		else {
			$this->setIdEmail(null);
		}
	}
	
	public static function getLista($idUsrLogado) {
			$resultMatrix = BancoDados::query("SELECT * FROM emails WHERE idDestinatario = '$idUsrLogado';");
			
			if(!empty($resultMatrix)){
				foreach($resultMatrix as $i => $arrParams)
					$lista[$i] = new Email(null, $arrParams);
				
				return $lista; //retorna lista de instancias de uma atividade
			} 
			else return null;
	}
	
	public static function buscar($idEmail, $idCurso, $idRemetente, $idDestinatario, $dataHoraInicio, $dataHoraFim, $assunto, $mensagem, $textobusca, $rascunho, $lixeira, $removido, $lido, $paginaAtual = NULL, $resultadosPagina = NULL, $ordenacaoAtual = NULL, $ordemAtual = NULL) {
		if (Email::validaBusca($idEmail, $idCurso, $idRemetente, $idDestinatario, $dataHoraInicio, $dataHoraFim, $assunto, $mensagem, $textobusca, $rascunho, $lixeira, $removido, $lido)) {
			$strQuerySelecaoTabela	=	$idDestinatario != null ? " emailsDestinatarios.removido AS removido, emailsDestinatarios.lixeira AS lixeira, emailsDestinatarios.lido AS lido" : " emails.removido AS removido, emails.lixeira AS lixeira";
			$strQuery 				= "SELECT emails.idEmail as idItem, idCurso, idRemetente, assunto, mensagem, dataHora, rascunho," . $strQuerySelecaoTabela . " FROM emails INNER JOIN emailDestinatarios WHERE ";
			
			$idEmails	=	null;
			if (is_array($idEmail)) {
				foreach ($idEmail as $id) {
					$idEmails	.=	$id . ", ";
				}
				$idEmails	=	preg_replace('/, $/', '', $idEmails);
			}
			else
				$idEmails	=	$idEmail;
	
			$strQuery .= $idEmails == null ? "" : "emails.idEmail IN (" . $idEmails . ") AND ";
			
			$strQuery .= $idCurso == null ? "" : "idCurso = " . $idCurso . " AND ";
			$strQuery .= $idRemetente == null ? "" : "idRemetente = " . $idRemetente . " AND ";
			$strQuery .= $idDestinatario == null ? "" : "idDestinatario = " . $idDestinatario . " AND ";
			
			$strQuery .= $dataHoraInicio != null ? 'dataHora >= "' . $dataHoraInicio . ' 0:0:0" AND ' : '';
			$strQuery .= $dataHoraFim != null ? 'dataHora <= "' . $dataHoraFim . ' 23:59:59" AND ' : '';
			
			$strQuery .= $rascunho != true ? ($rascunho = false ? 'rascunho = FALSE AND ' : '') : 'rascunho = TRUE AND ';
			$strQuery .= $lixeira != true ? ($lixeira = false ? 'rascunho = FALSE AND ' : '') : 'lixeira = TRUE AND ';
			$strQuery .= $lido != true ? ($lido = false ? 'rascunho = FALSE AND ' : '') : 'lido = TRUE AND ';
			
			$strQuery		.=	$assunto != null ? configuraRegexpStringBusca(codificaStringBusca($assunto), 'assunto') : '';
			$strQuery		.=	$mensagem != null ? configuraRegexpStringBusca(codificaStringBusca($mensagem), 'mensagem') : '';
			$strQuery		.=	$textobusca != null ? '(' . configuraRegexpStringBusca(codificaStringBusca($textobusca), 'assunto') : '';
			$strQuery		=	$textobusca != null ? preg_replace('/ AND $/', ' ', $strQuery) . " OR " : '';
			$strQuery		.=	$textobusca != null ? configuraRegexpStringBusca(codificaStringBusca($textobusca), 'mensagem') . ')' : '';
			$strQuery 		=	preg_replace('/ WHERE $/', ' ', $strQuery);
			$strQuery		=	preg_replace('/ AND $/', ' ', $strQuery);
			$strQuery		=	preg_replace('/ AND \)$/', ') ', $strQuery);
			
			$strQueryCount	=	'SELECT COUNT(*) AS qtdResultados FROM (' . $strQuery . ') AS queryOriginal';
			
			if ($resultadoCount = BancoDados::query($strQueryCount)) {
				foreach($resultadoCount as $resultado) {
					$qtdResultados	=	$resultado['qtdResultados'];
				}
	
				if ($qtdResultados > 0) {
					$paginaAtual	=	$paginaAtual == NULL	?	1 : $paginaAtual;
					$ordenacaoAtual	=	$ordenacaoAtual == NULL	?	'dataHora' : $ordenacaoAtual;
					$ordemAtual		=	$ordemAtual == NULL		?	'DESC' : ($ordemAtual == 'desc' ? 'DESC' : 'ASC');
						
					$strQuery	.=	' ORDER BY ' . $ordenacaoAtual . ' ' . $ordemAtual;
						
					if ($resultadosPagina != NULL) {
						$qtdPaginas		=	ceil($qtdResultados / $resultadosPagina);
						$qtdPaginas		=	$qtdPaginas == 0 ? 1 : $qtdPaginas;
	
						$strQuery		.=	' LIMIT ' . $resultadosPagina . ' OFFSET ' . (($paginaAtual - 1) * $resultadosPagina);
						
					}else{
						$qtdPaginas	=	1;
					}
						
					$strQuery .= ';';
					
					$resultado = BancoDados::query($strQuery);
					
					if(is_array($resultado)){
						return array ('listaResultados' => $resultado, 'qtdResultadosTotal' => $qtdResultados, 'qtdPaginas' => $qtdPaginas);
					}else{
						return false;
					}
					
				}
				else {
					return array('listaResultados' => array(), 'qtdResultadosTotal' => 0, 'qtdPaginas' => 0);
				}
			}
			else {
				return false;
			}
		}
		else {
			return array('listaResultados' => array(), 'qtdResultadosTotal' => 0, 'qtdPaginas' => 0);
		}
	}
	
	public static function validaBusca($idEmail, $idCurso, $idRemetente, $idDestinatario, $dataHoraInicio, $dataHoraFim, $assunto, $mensagem, $textobusca, $rascunho, $lixeira, $removido, $lido) {
		return true;
	}
	
	
	public static function enviarEmail($idEmail, $idCurso, $idRemetente, $idDestinatarios, $assunto, $mensagem, $rascunho = false) {
		if (validar($idEmail, $idCurso, $idRemetente, $idDestinatarios, $assunto, $mensagem, $rascunho)) {
			if (is_null($idEmail)) {
				//Executando LOCK na tabela emails para resgatar o ID do email inserido
				$strQuery	=	"LOCK TABLES emails WRITE";
				
				if (!($conexao = BancoDados::conectaBD())) {
					return false;
				}
					
				if (!BancoDados::query($strQuery, $conexao)) {
					return false;
				}
				
				$strRascunho	=	$rascunho ?	'1' : '0'; 
				$strQuery	=	"INSERT INTO emails VALUES (default, " . $idCurso . ", " . $idRemetente . ", '" . $assunto . "', '" . $mensagem . "', NOW(), " . $strRascunho . ", 0, 0)";
				if(!BancoDados::query($strQuery, $conexao)){
					return false;
				}
				$idEmail	=	mysql_insert_id($conexao);
				
				BancoDados::desconectaBD($conexao);
				if (!Email::inserirDestinatarios($idEmail, $idDestinatarios)) {
					//TODO Enviar Email para o ADM
					return false;
				}
				return true;
				
				
				
			}
			else {
				$strRascunho	=	$rascunho ?	'1' : '0'; 
				$strQuery	=	"UPDATE emails SET assunto = '" . $assunto . "', mensagem = '" . $mensagem . "', rascunho = " . $strRascunho;
				if(!BancoDados::query($strQuery)){
					return false;
				}
				
				if (!Email::inserirDestinatarios($idEmail, $idDestinatarios)) {
					//TODO Enviar Email para o ADM
					return false;
				}
				return true;
			}
		}
		else {
			return false;
		}
	}
	
	public static function inserirDestinatarios($idEmail, $idDestinatarios) {
		if (excluirDestinatarios($idEmail, $idDestinatarios)) {
			foreach($idDestinatarios as $idDestinatario) {
				$strQuery	=	"INSERT INTO emailDestinatarios VALUES (" . $idDestinatario . ", " . $idEmail . ", 0, 0, 0)";
				if (!BancoDados::query($strQuery)) {
					return false;
				}
			}
			return true;
		}
		else {
			return false;
		}
	}
	
	public static function excluirDestinatarios($idEmail, $idDestinatarios) {
		foreach($idDestinatarios as $idDestinatario) {
			$strQuery	=	"DELETE FROM emailDestinatarios WHERE idEmail = " . $idEmail . " AND idDestinatario = " . $idDestinatario;
			if (!BancoDados::query($strQuery)) {
				return false;
			}
			return true;
		}
	}
	
	public static function salvarRascunho($idEmail, $idCurso, $idRemetente, $idDestinatarios, $assunto, $mensagem) {
		return Email::enviarEmail($idEmail, $idCurso, $idRemetente, $idDestinatarios, $assunto, $mensagem, true);
	}
	
	public static function alterarStatus($lido, $lixeira) {
		
	}
	
	public static function moverParaLixeira($idEmail) {
		Email::alterarStatus($idEmail, null, true);
	}
	
	public static function moverParaEntrada($idEmail) {
		Email::alterarStatus($idEmail, null, false);
	}
	
	public static function marcarComoLido($idEmail) {
		Email::alterarStatus($idEmail, true, null);
	}
	
	public static function marcarComoNaoLido($idEmail) {
		Email::alterarStatus($idEmail, false, null);
	}
	
	public static function validar($idEmail, $idCurso, $idRemetente, $idDestinatarios, $assunto, $mensagem, $rascunho) {
		return true;
	}
	
	/**
     * Returns $idEmail.
     * @see Email::$idEmail
     */
    public function getIdEmail()
    {
        return $this->idEmail;
    }
    
    /**
     * Sets $idEmail.
     * @param object $idEmail
     * @see Email::$idEmail
     */
    public function setIdEmail($idEmail)
    {
        $this->idEmail = $idEmail;
    }
    
	/**
     * Returns $idCurso.
     * @see Email::$idCurso
     */
    public function getIdCurso()
    {
        return $this->idCurso;
    }
    
    /**
     * Sets $idCurso.
     * @param object $idCurso
     * @see Email::$idCurso
     */
    public function setIdCurso($idCurso)
    {
        $this->idCurso = $idCurso;
    }
    
	/**
     * Returns $idRementente.
     * @see Email::$idRementente
     */
    public function getIdRementente()
    {
        return $this->idRementente;
    }
    
    /**
     * Sets $idRementente.
     * @param object $idRementente
     * @see Email::$idRementente
     */
    public function setIdRementente($idRementente)
    {
        $this->idRementente = $idRementente;
    }
    
	/**
     * Returns $assunto.
     * @see Email::$assunto
     */
    public function getAssunto()
    {
        return $this->assunto;
    }
    
    /**
     * Sets $assunto.
     * @param object $assunto
     * @see Email::$assunto
     */
    public function setAssunto($assunto)
    {
        $this->assunto = $assunto;
    }
    
	/**
     * Returns $mensagem.
     * @see Email::$mensagem
     */
    public function getMensagem()
    {
        return $this->mensagem;
    }
    
    /**
     * Sets $mensagem.
     * @param object $mensagem
     * @see Email::$mensagem
     */
    public function setMensagem($mensagem)
    {
        $this->mensagem = $mensagem;
    }
    
	/**
     * Returns $dataHora.
     * @see Email::$dataHora
     */
    public function getDataHora()
    {
        return $this->dataHora;
    }
    
    /**
     * Sets $dataHora.
     * @param object $dataHora
     * @see Email::$dataHora
     */
    public function setDataHora($dataHora)
    {
        $this->dataHora = $dataHora;
    }
    
	/**
     * Returns $rascunho.
     * @see Email::$rascunho
     */
    public function getRascunho()
    {
        return $this->rascunho;
    }
    
    /**
     * Sets $rascunho.
     * @param object $rascunho
     * @see Email::$rascunho
     */
    public function setRascunho($rascunho)
    {
        $this->rascunho = $rascunho;
    }
    
	/**
     * Returns $lixeira.
     * @see Email::$lixeira
     */
    public function getLixeira()
    {
        return $this->lixeira;
    }
    
    /**
     * Sets $lixeira.
     * @param object $lixeira
     * @see Email::$lixeira
     */
    public function setLixeira($lixeira)
    {
        $this->lixeira = $lixeira;
    }
    
    public function setLido($lido)
    {
        $this->lido = $lido;
    }
	/**
     * Returns $removido.
     * @see Email::$removido
     */
    public function getRemovido()
    {
        return $this->removido;
    }
    
    /**
     * Sets $removido.
     * @param object $removido
     * @see Email::$removido
     */
    public function setRemovido($removido)
    {
        $this->removido = $removido;
    }
}
?>